#ifndef _FM1208_API_H_
#define _FM1208_API_H_

#include "rfid_board.h"

#if _RFID_FUNCTION_ENABLE_

typedef struct
{
  uint8_t TL;
  uint8_t T0;
  uint8_t TA1;
  uint8_t TB1;
  uint8_t TC1;
  uint8_t FSCI;
  uint8_t FWI;
  uint8_t SFGI;
} ATS_STR;

typedef struct
{
  uint8_t PCB;
  uint8_t CID;
  uint8_t WTXM;
  uint8_t FSD;
  uint16_t FWT;
  ATS_STR ATS;
} CPU_CARD_STR;

/**
 * @brief 调整通信波特率
 * 
 * @param Mode - 0: 接收发送波特率106kbps
 *               1: 接收发送波特率212kbps
 *               2: 收发送波特率424kbps
 *               3: 收发送波特率848kbps
 */
extern void CPU_BaudRate_Set(uint8_t Mode);

/**
 * @brief 获取接收数据帧长度
 * 
 * @param fsdi     - 模式
 * @return uint8_t - 数据帧长度
 */
extern uint8_t CPU_FSD(uint8_t fsdi);

/**
 * @brief 获取最大等待时间
 * 
 * @param fwi       - 模式
 * @return uint16_t - 等待时间
 */
extern uint16_t CPU_FWT(uint8_t fwi);

/**
 * @brief 发起 NAK 信号
 * 
 * @param pRxDataBuff - 返回接收得数据
 * @param pRxDataSize - 接收数据长度
 * @return bool       - 发起状态（true：成功 false：失败）
 */
extern bool CPU_NAK(uint8_t *pRxDataBuff, uint8_t *pRxDataSize);

/**
 * @brief 发起 ACK 信号
 * 
 * @param pRxDataBuff - 返回接收得数据
 * @param pRxDataSize - 接收数据长度
 * @return bool       - 发起状态（true：成功 false：失败）
 */
extern bool CPU_ACK(uint8_t *pRxDataBuff, uint8_t *pRxDataSize);

/**
 * @brief RATS 复位
 *
 * @param Param1      - 参数1
 * @param Param2      - 参数2
 * @param pRxDataBuff - 返回接收得数据
 * @param pRxDataSize - 接收数据长度
 * @return uint8_t    - 执行状态
 */
extern bool Rats(uint8_t Param1, uint8_t Param2, uint8_t *pRxDataBuff, uint8_t *pRxDataSize);

/**
 * @brief 发起 PPS 交换
 * 
 * @param pps0        - 参数0
 * @param pps1        - 参数1
 * @param pRxDataBuff - 返回接收得数据
 * @param pRxDataSize - 接收数据长度
 * @return bool       - 命令执行状态（true ：成功 false：失败）
 */
extern bool CPU_PPS(uint8_t pps0, uint8_t pps1, uint8_t *pRxDataBuff, uint8_t *pRxDataSize);

/**
 * @brief 转换 PCB 码 
 * 
 */
extern void CPU_PCB_CONVER(void);

/**
 * @brief 发起 TPDU 传输
 * 
 * @param pTxDataBuff - 待写入得数据
 * @param TxDataSize  - 待写入数据长度
 * @param pRxDataBuff - 返回接收得数据
 * @param pRxDataSize - 接收数据长度
 * @return bool       - 命令执行状态（true ：成功 false：失败）
 */
extern bool CPU_TPDU(uint8_t *pTxDataBuff, uint8_t TxDataSize, uint8_t *pRxDataBuff, uint8_t *pRxDataSize);

/**
 * @brief 写块信息
 * 
 * @param pTxDataBuff - 待写入得数据
 * @param TxDataSize  - 待写入数据长度
 * @param pRxDataBuff - 返回接收得数据
 * @param pRxDataSize - 接收数据长度
 * @return bool       - 命令执行状态（true ：成功 false：失败）
 */
extern bool CPU_I_Block(uint8_t *pTxDataBuff, uint8_t TxDataSize, uint8_t *pRxDataBuff, uint8_t *pRxDataSize);

/**
 * @brief 读块信息
 * 
 * @param pRxDataBuff - 返回接收得数据
 * @param pRxDataSize - 接收数据长度
 * @return bool       - 命令执行状态（true ：成功 false：失败）
 */
extern bool CPU_R_Block(uint8_t *pRxDataBuff, uint8_t *pRxDataSize);

/**
 * @brief 发起 WTX 命令
 * 
 * @param wtxm 
 * @param pRxDataBuff - 返回接收得数据
 * @param pRxDataSize - 接收数据长度
 * @return bool       - 命令执行状态（true ：成功 false：失败）
 */
extern bool CPU_WTX(uint8_t wtxm, uint8_t *pRxDataBuff, uint8_t *pRxDataSize);

/**
 * @brief 发起 Deselect 命令
 * 
 * @return bool       - 命令执行状态（true ：成功 false：失败）
 */
extern bool CPU_Deselect(void);

/**
 * @brief 启动一次 APDU 传输
 * 
 * @param pTxDataBuff - 待写入得数据
 * @param TxDataSize  - 待写入数据长度
 * @param pRxDataBuff - 返回接收得数据
 * @param pRxDataSize - 接收数据长度
 * @return bool       - 命令执行状态（true ：成功 false：失败）
 */
extern bool APDU_Exchange(uint8_t *pDataIn, uint8_t SizeIn, uint8_t *pDataOut, uint16_t *pSizeOut);

#endif
#endif
